//
// Created by XML on 2023/10/8.
//  函数指针
#include <stdio.h>
#include <stdlib.h>
#include <io_utils.h>


int add(int a,int b){
    return a + b;
}

int minus(int a,int b){
    return a - b;
}

/**
 * int (*methodP)(int, int)
 * int：函数的返回值
 * (*methodP)：函数指针名称
 * (int, int)：函数的形参类型，要一一对应
 *
 * @param methodP  函数指针形参
 * @param a
 * @param b
 */
void operation(int (*methodP)(int, int), int a, int b) {
  int result = methodP(a,b);
    PRINT_INT(result);
}

// typedef  A B
// A： 返回值类型  B：别名
// 其中Operation时函数指针的别名
 typedef void (*Operation)(int (*methodP)(int, int), int a, int b);

int main() {
    //  &main = main 都是函数内存地址
    PRINT_HEX(&main); //  0x401550
    PRINT_HEX(main);  //  0x401550

   // operation的函数指针
   void (*operationP)(int (*methodP)(int, int), int a, int b);
   operationP = &operation;

    PRINT_HEX(operationP);
    PRINT_HEX(operation);

    operationP(&add,1,1);

    operation(add,1,1);

    operation(minus,1,2);

    // 给别名赋值
    Operation operationFun = operation;
    // 调用
    operationFun(minus, 1,3);



    return 0;
}
